package sistemioperativi.es3.rw;
import java.util.concurrent.*;


public class RW4 extends MemoriaCondivisa {

	
	private Semaphore scrittura = new Semaphore(1);
	private Semaphore mutex = new Semaphore(1);
	
	
	private int numLettori = 0;
	
	private int lettoriSoddisfatti = 0;
	private int scrittoriSoddisfatti = 0;
	
	private final int soglia = 5;
	
	
	private int questo(){
		return (int) Thread.currentThread().getId();
	}
	
	@Override
	public void inizioScrittura() throws InterruptedException {
		
		System.out.println(questo()+" prova a SCRIVERE");
		scrittura.acquire();
		
	}

	@Override
	public void fineScrittura() throws InterruptedException {
		
	//	mutex.acquire();
		System.out.println(questo()+" ha finito di SCRIVERE");
		scrittura.release();
		
//		mutex.release();
	
	}

	@Override
	public void inizioLettura() throws InterruptedException {
		
		mutex.acquire();
		System.out.println(questo()+" Chiede il permesso per LEGGERE");
		numLettori++;
		if(numLettori == 1){
			System.out.println("Blocco gli scrittori e il resto ");
			scrittura.acquire();
		}
		mutex.release();
	}

	@Override
	public void fineLettura() throws InterruptedException {
	
		mutex.acquire();
		numLettori--;
		
		System.out.println(questo()+" Ha finito la LETTURA");
		
		if(numLettori == 0){
			//sblocco le write
			System.out.println("Sblocco le write");
			scrittura.release();
		}
		
		mutex.release();
	}//EO FineLettura

}
